package cn.dt.ymcc.mq.consumer;

import cn.dt.ymcc.domain.CourseMarket;
import cn.dt.ymcc.domain.CourseUserLearn;
import cn.dt.ymcc.dto.PayNotifyDto;
import cn.dt.ymcc.service.ICourseMarketService;
import cn.dt.ymcc.service.ICourseUserLearnService;
import cn.dt.ymcc.util.AssertUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

@RocketMQMessageListener(
        consumerGroup = "course-info-consumer",
        topic = "pay-notify-topic",
        selectorExpression = "pay-notify-tag",
        messageModel = MessageModel.BROADCASTING
)
public class PayConsumer implements RocketMQListener<MessageExt> {

    @Autowired
    private ICourseUserLearnService courseUserLearnService;
    @Autowired
    private ICourseMarketService courseMarketService;
    /**
     *
     * 保存用户的课程购买记录
     * 1.如果一个支付单购买了多个课程，那么应该保存多条购买记录
     * 2.课程观看的；结束时间怎么来？
     *  开始时间 --现在
     *  结束时间 --现在时刻 + courseMarket中的可看天数
     * ================思考问题：如果过了结束时间，那么我就不能看课程
     * 但是我们可以--续费-- 第一次购买，录入一条记录-- 第二次购买， 看课程是否过期
     *  。如果过期直接覆盖
     *  。如果没有过期，追加可看天数
     *  。订单号存最近购买的那个订单号（把以前历史的订单号覆盖掉）
     * @param messageExt
     */
    @Override
    public void onMessage(MessageExt messageExt) {
        byte[] body = messageExt.getBody();
        AssertUtil.isNotNull(body,"消息没有拿到");
        String payOrderStr = new String(body, StandardCharsets.UTF_8);
        PayNotifyDto dto = JSONObject.parseObject(payOrderStr, PayNotifyDto.class);
        //获取订单号
        String orderNo = dto.getOrderNo();
        JSONObject object = JSONObject.parseObject(dto.getExtParams());
        Long userId = (Long) object.get("userId");
        String[] courseIds = object.get("courseId").toString().split(",");
        Date date = new Date();
        for (String courseIdStr : courseIds) {
            Long coureseId = Long.valueOf(courseIdStr);
            //查询market表拿到validday有效天数
            CourseMarket courseMarket = courseMarketService.selectById(coureseId);
            //获取有效天数
            Integer validDays = courseMarket.getValidDays();
            CourseUserLearn courseUserLearn = selectByUserIdAndCourseId(userId,coureseId);
            //查询不到权限就创建
            if(courseUserLearn==null){
                courseUserLearn.setCourseId(coureseId);
                courseUserLearn.setLoginId(userId);
                courseUserLearn.setStartTime(date);
                //到期时间是当前时间+有效天数
                Date endTime = DateUtils.addDays(date, validDays);
                courseUserLearn.setEndTime(endTime);
                courseUserLearn.setState(0);
                courseUserLearn.setCourseOrderNo(orderNo);
                courseUserLearn.setCreateTime(date);
                courseUserLearnService.insert(courseUserLearn);
                //到期时间比现在小那就是过期了，直接覆盖:courseUserLearn.getEndTime().before(date)时间比较方式也可以这样

            }else{
                if (courseUserLearn.getEndTime().compareTo(date)<0){
                    courseUserLearn.setCourseId(coureseId);
                    courseUserLearn.setLoginId(userId);
                    courseUserLearn.setStartTime(date);
                    //到期时间是当前时间+有效天数
                    Date endTime = DateUtils.addDays(date, validDays);
                    courseUserLearn.setEndTime(endTime);
                    courseUserLearn.setState(0);
                    courseUserLearn.setCourseOrderNo(orderNo);
                    courseUserLearn.setCreateTime(date);
                    courseUserLearnService.insert(courseUserLearn);
                }else{
                    //没有过期就追加有效日期
                    Date endTime = DateUtils.addDays(date, validDays);
                    courseUserLearn.setEndTime(endTime);
                }
                courseUserLearnService.updateById(courseUserLearn);
            }

        }

    }

    private CourseUserLearn selectByUserIdAndCourseId(Long userId, Long coureseId) {
        Wrapper<CourseUserLearn> wrapper = new EntityWrapper<>();
        wrapper.eq("course_id",coureseId)
                .eq("login_id",userId);
        return courseUserLearnService.selectOne(wrapper);

    }


}